{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d5a8a6a7",
   "metadata": {},
   "source": [
    "---------------\n",
    "* 记录人：hj\n",
    "* 时间：21-11-25\n",
    "* week13\n",
    "* 参考文档：\n",
    "> 1.[python官方文档](https://python/org)  \n",
    "> 2.[老师的gitee](https://gitee.com/xzhichao/python)  \n",
    "> 3.[老师的博客](https://www.cnblogs.com/xuzhichao)  \n",
    "---------------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "efb12308",
   "metadata": {},
   "source": [
    "# 上周回顾\n",
    "## Json(文本数据) -->.Dict(python中的字典数据)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e18e139e",
   "metadata": {},
   "source": [
    "## 字典和列表的综合实践"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "72955f3b",
   "metadata": {},
   "source": [
    "# 本周内容：\n",
    "## [集合](https://docs.python.org/3/tutorial/datastructures.html#sets)\n",
    "\n",
    "* 我想了解一组数据中有哪些唯一存在的值？（假如是列表） \n",
    "\n",
    "\n",
    "> 1.集合的性质  \n",
    "\n",
    ">>1.无序(unordered)   \n",
    ">>2.不重复(no duplicate)   \n",
    "\n",
    "> 2.集合的一般方法  \n",
    "\n",
    ">> 1.增加  \n",
    ">> 2.删除  \n",
    ">> 3.查询：in查询成员关系  \n",
    "\n",
    "> 3.集合的数学逻辑运算    "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fd192e07",
   "metadata": {},
   "source": [
    "* 我想了解一组数据中有哪些唯一存在的值？（假如是列表）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "8de9c43e",
   "metadata": {},
   "outputs": [],
   "source": [
    "no_duplicate_age = []\n",
    "list_age = [18,24,25,18,23,18]\n",
    "for i in list_age:\n",
    "    if i not in no_duplicate_age:\n",
    "        no_duplicate_age.append(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "82c1f3c0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[18, 24, 25, 23]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "no_duplicate_age"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "0a63ecdd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{18, 23, 24, 25}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# list--> set的方法：set()\n",
    "no_duplicate_age_set = set(list_age)\n",
    "no_duplicate_age_set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "1a820772",
   "metadata": {},
   "outputs": [],
   "source": [
    "#字典的括号加字典的形式（没顺序）\n",
    "#'集合'的好处：去除重复项和数学的运算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "e6b5e53e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'banana', 'apple', 'orange', 'pear'}\n",
      "True\n",
      "False\n"
     ]
    }
   ],
   "source": [
    "# 1.移除重复项\n",
    "basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}\n",
    "print(basket)\n",
    "# 2.in 查询成员的关系,在数据结构里面是通用的方法\n",
    "print('orange' in basket)\n",
    "print('crabgrass' in basket)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "da60e601",
   "metadata": {},
   "source": [
    "### 2.集合一般方法\n",
    "* 集合的创建的两种一般方法：  \n",
    "> 1.set（list）  \n",
    "> 2.直接按照集合的 结构构建：{value1,value2,....}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "db6b5c21",
   "metadata": {},
   "source": [
    "> 1.增加add()\n",
    "\n",
    ">> 结果：Add an element to a set.  \n",
    ">> 注意：This has no effect if the element is already present.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "9c15d41a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 66, 3, 4, 7, 8}\n"
     ]
    }
   ],
   "source": [
    "set_1 = set([1,3,4,0,8,66,7])\n",
    "print(set_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "0c2aa879",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on built-in function add:\n",
      "\n",
      "add(...) method of builtins.set instance\n",
      "    Add an element to a set.\n",
      "    \n",
      "    This has no effect if the element is already present.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(set_1.add)#append是列表的末尾增加，但是集合(因为无序)是没有末尾的，所以是add"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "2791a6a1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 66, 3, 4, 99, 7, 8}\n"
     ]
    }
   ],
   "source": [
    "set_1.add(99)\n",
    "print(set_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "04cd162b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 66, 3, 4, 99, 7, 8}\n"
     ]
    }
   ],
   "source": [
    "set_1.add(66)\n",
    "print(set_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "8fb49e85",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 66, 3, 4, 7, 8}\n"
     ]
    }
   ],
   "source": [
    "set_1 = set([1,3,4,0,8,66,7])\n",
    "print(set_1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9375cbd",
   "metadata": {},
   "source": [
    "> 2.删除\n",
    ">> pop():Remove and return an arbitrary set element.Raises KeyError if the set is empty.  \n",
    ">> remove():Remove an element from a set; it must be a member. If the element is not a member, raise a KeyError.  \n",
    ">> discard():Remove an element from a set if it is a member.If the element is not a member, do nothing.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "15b3e209",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on built-in function pop:\n",
      "\n",
      "pop(...) method of builtins.set instance\n",
      "    Remove and return an arbitrary set element.\n",
      "    Raises KeyError if the set is empty.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(set_1.pop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "00df2f9d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{0, 1, 66, 3, 4, 7, 8}\n",
      "{1, 66, 3, 4, 7, 8}\n"
     ]
    }
   ],
   "source": [
    "# Remove and return an arbitrary set element.\n",
    "print(set_1)\n",
    "set_1.pop()\n",
    "print(set_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "6221bc5b",
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyError",
     "evalue": "'pop from an empty set'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-21-df2dc50aa03f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m# Raises KeyError if the set is empty.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[0mset_2\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mset\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mset_2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m: 'pop from an empty set'"
     ]
    }
   ],
   "source": [
    " # Raises KeyError if the set is empty.\n",
    "set_2 = set([])\n",
    "set_2.pop()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f67c836",
   "metadata": {},
   "source": [
    "> 移除remove()\n",
    ">> Remove an element from a set; it must be a member.\n",
    "  If the element is not a member, raise a KeyError."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "16101a36",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on built-in function remove:\n",
      "\n",
      "remove(...) method of builtins.set instance\n",
      "    Remove an element from a set; it must be a member.\n",
      "    \n",
      "    If the element is not a member, raise a KeyError.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(set_1.remove)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "cbbe850c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{1, 66, 3, 4, 7, 8}\n",
      "{1, 3, 4, 7, 8}\n"
     ]
    }
   ],
   "source": [
    "# 1. Remove an element from a set; it must be a member.\n",
    "print(set_1)\n",
    "set_1.remove(66)\n",
    "print(set_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "ed16dca1",
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyError",
     "evalue": "66",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-24-628b5352d1b3>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m# 2.If the element is not a member, raise a KeyError.一般项目中remove（）和共同使用\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mset_1\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m66\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m: 66"
     ]
    }
   ],
   "source": [
    "# 2.If the element is not a member, raise a KeyError.一般项目中remove（）和共同使用\n",
    "set_1.remove(66)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "52e0d19a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# * 避免KeyError的方式：\n",
    "if 66 in set_1:#先查询“66”是否存在\n",
    "    set_1.remove(66)#若存在则移除"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "5b050042",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on built-in function discard:\n",
      "\n",
      "discard(...) method of builtins.set instance\n",
      "    Remove an element from a set if it is a member.\n",
      "    \n",
      "    If the element is not a member, do nothing.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(set_1.discard)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "f8a5df23",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{1, 3, 4, 7, 8}\n"
     ]
    }
   ],
   "source": [
    "print(set_1)\n",
    "set_1.discard(66)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "91601989",
   "metadata": {},
   "source": [
    "### 集合的运算\n",
    "\n",
    "> 1.集合的交集  \n",
    " \n",
    "> 2.集合的并集  \n",
    "\n",
    "> 3.集合的差集  \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "41ee0bb2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set_1: {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2: {0, 1, 66, 3, 4, 7, 8}\n"
     ]
    }
   ],
   "source": [
    "set_1 = set([1,2,5,6,7,2,3,2,4,4])\n",
    "set_2 = set([1,3,4,0,8,66,7])\n",
    "print(\"set_1:\",set_1)\n",
    "print(\"set_2:\",set_2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1588fa60",
   "metadata": {},
   "source": [
    "> 1.集合的交集  \n",
    "\n",
    ">> 1.使用集合的方法：set_1.intersection(set_2)  \n",
    ">> 2.使用逻辑运算符: set_1 & set_2 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "12927791",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on built-in function intersection:\n",
      "\n",
      "intersection(...) method of builtins.set instance\n",
      "    Return the intersection of two sets as a new set.\n",
      "    \n",
      "    (i.e. all elements that are in both sets.)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(set_1.intersection)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "d36d0080",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set_1: {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2: {0, 1, 66, 3, 4, 7, 8}\n",
      "交集结果 {1, 3, 4, 7}\n"
     ]
    }
   ],
   "source": [
    "# 使用集合的方法：set_1.intersection(set_2)\n",
    "print(\"set_1:\",set_1)\n",
    "print(\"set_2:\",set_2)\n",
    "print(\"交集结果\",set_1.intersection(set_2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "6c7289e9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set_1: {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2: {0, 1, 66, 3, 4, 7, 8}\n",
      "交集结果 {1, 3, 4, 7}\n"
     ]
    }
   ],
   "source": [
    "# 使用逻辑运算符：set_1 & set_2\n",
    "print(\"set_1:\",set_1)\n",
    "print(\"set_2:\",set_2)\n",
    "print(\"交集结果\",set_1 & set_2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "5976b02b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 实践：\n",
    "set_1_xu = {\"星期一12-14\",\"星期二3-5\",\"星期二12-14\" }\n",
    "set_2_前端 = {\"星期二3-5\",\"星期二12-14\"}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "eeb7f6ed",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'星期二12-14', '星期二3-5'}\n",
      "结论：周一班 API课 让给前端的同学~\n"
     ]
    }
   ],
   "source": [
    "print(set_1_xu & set_2_前端)\n",
    "print(\"结论：周一班 API课 让给前端的同学~\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d8fd8fd",
   "metadata": {},
   "source": [
    "> 2.集合的并集  \n",
    ">> 1.使用并集的方法：set_1.union(set_2)  \n",
    ">> 2.使用逻辑运算符：set_1 | set_2  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "f3dcf06a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set_1: {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2: {0, 1, 66, 3, 4, 7, 8}\n",
      "并集结果 {0, 1, 2, 3, 4, 5, 6, 7, 66, 8}\n"
     ]
    }
   ],
   "source": [
    "# 1.使用并集的方法：set_1.union(set_2)\n",
    "print(\"set_1:\",set_1)\n",
    "print(\"set_2:\",set_2)\n",
    "print(\"并集结果\",set_1.union(set_2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "e6e904cf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set_1: {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2: {0, 1, 66, 3, 4, 7, 8}\n",
      "并集结果 {0, 1, 2, 3, 4, 5, 6, 7, 66, 8}\n"
     ]
    }
   ],
   "source": [
    "# 2.使用逻辑运算符：set_1 | set_2\n",
    "print(\"set_1:\",set_1)\n",
    "print(\"set_2:\",set_2)\n",
    "print(\"并集结果\",set_1 | set_2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "faa61d79",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始的时间： <built-in function time>\n",
      "set_1: {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2: {0, 1, 66, 3, 4, 7, 8}\n",
      "并集结果 {0, 1, 2, 3, 4, 5, 6, 7, 66, 8}\n",
      "结束的时间 1638193264.2974854\n",
      "运行的时间 0.0\n"
     ]
    }
   ],
   "source": [
    "# 计算运行效率 只需知道运行后的时间节点-运行前的试卷节点\n",
    "import time\n",
    "start_time = time.time()\n",
    "print(\"开始的时间：\",time.time)\n",
    "print(\"set_1:\",set_1)\n",
    "print(\"set_2:\",set_2)\n",
    "print(\"并集结果\",set_1 | set_2)\n",
    "stop_time = time.time()\n",
    "print(\"结束的时间\",stop_time)\n",
    "print(\"运行的时间\",stop_time - start_time) # 算法的优化等例：京东"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "deb2a566",
   "metadata": {},
   "source": [
    "> 3.集合的差集(考虑先后顺序)\n",
    ">> 1.使用差集的方法：set_1.difference(set_2)  \n",
    "   2.使用逻辑运算符：set_1 - set_2  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "2a0090ae",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set_1: {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2: {0, 1, 66, 3, 4, 7, 8}\n",
      "set_1 和 set_2 差集结果 {2, 5, 6}\n"
     ]
    }
   ],
   "source": [
    "print(\"set_1:\",set_1)\n",
    "print(\"set_2:\",set_2)\n",
    "print(\"set_1 和 set_2 差集结果\",set_1.difference(set_2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "f9430cb6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set_1: {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2: {0, 1, 66, 3, 4, 7, 8}\n",
      "set_2 和 set_1差集结果 {0, 8, 66}\n"
     ]
    }
   ],
   "source": [
    "print(\"set_1:\",set_1)\n",
    "print(\"set_2:\",set_2)\n",
    "print(\"set_2 和 set_1差集结果\",set_2.difference(set_1))#谁放前面就是谁减谁"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "d60088f0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set_1 :  {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2 :  {0, 1, 66, 3, 4, 7, 8}\n",
      "set_1 和 set_2 差集结果 :  {2, 5, 6}\n"
     ]
    }
   ],
   "source": [
    "print(\"set_1 : \",set_1)\n",
    "print(\"set_2 : \",set_2)\n",
    "print(\"set_1 和 set_2 差集结果 : \",set_1 - set_2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "8b0f62b0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set_1 :  {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2 :  {0, 1, 66, 3, 4, 7, 8}\n",
      "set_2 和 set_1 差集结果 :  {0, 8, 66}\n"
     ]
    }
   ],
   "source": [
    "print(\"set_1 : \",set_1)\n",
    "print(\"set_2 : \",set_2)\n",
    "print(\"set_2 和 set_1 差集结果 : \",set_2 - set_1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "80f4d856",
   "metadata": {},
   "source": [
    "> 4.对称差集  \n",
    ">> 1.用对称差集的方法：set_1.symmetric_difference(set_2)  \n",
    ">> 2.运用逻辑运算符：? (set_1 - set_2) | (set_2-set_1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "214c0e85",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on built-in function symmetric_difference:\n",
      "\n",
      "symmetric_difference(...) method of builtins.set instance\n",
      "    Return the symmetric difference of two sets as a new set.\n",
      "    \n",
      "    (i.e. all elements that are in exactly one of the sets.)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(set_1.symmetric_difference)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "b1f4a763",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set_1: {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2: {0, 1, 66, 3, 4, 7, 8}\n",
      "对称差集结果 {0, 66, 2, 5, 6, 8}\n"
     ]
    }
   ],
   "source": [
    "print(\"set_1:\",set_1)\n",
    "print(\"set_2:\",set_2)\n",
    "print(\"对称差集结果\",set_1.symmetric_difference(set_2))#数据库的操作中会遇到"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "2854fb98",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "set_1 :  {1, 2, 3, 4, 5, 6, 7}\n",
      "set_2 :  {0, 1, 66, 3, 4, 7, 8}\n",
      "对称差集结果 :  {0, 2, 66, 5, 6, 8}\n"
     ]
    }
   ],
   "source": [
    "print(\"set_1 : \",set_1)\n",
    "print(\"set_2 : \",set_2)\n",
    "print(\"对称差集结果 : \",(set_1 - set_2) | (set_2-set_1))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "edb55f55",
   "metadata": {},
   "source": [
    " ## 集合实践 p129"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "b8dd2520",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Provide a word to search for vowels:hello kitty\n",
      "e\n",
      "i\n",
      "o\n"
     ]
    }
   ],
   "source": [
    "vowels = set('aeiou')\n",
    "word = input(\"Provide a word to search for vowels:\")\n",
    "found = vowels.intersection(set(word))\n",
    "for vowel in found:          \n",
    "    print(vowel)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "4b39eaa9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "vowels :  {'e', 'i', 'o', 'u', 'a'}\n",
      "Provide a word to search for vowels:oh my god\n",
      "word :  {'d', 'm', ' ', 'h', 'o', 'g', 'y'}\n",
      "{'o'}\n"
     ]
    }
   ],
   "source": [
    "vowels = set('aeiou')\n",
    "print(\"vowels : \",vowels)\n",
    "word = input(\"Provide a word to search for vowels:\")\n",
    "print(\"word : \",set(word))\n",
    "found = vowels.intersection(set(word))\n",
    "print(found)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c9247f76",
   "metadata": {},
   "source": [
    "## 课后作业：\n",
    ">1.课堂练习  \n",
    " 2.课本第三章 课后项目练习  \n",
    " 3.总结集合方法 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2d03edd4",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
